#include "Perus.h"



int main(int argc, char *argv[])
{
    srand((unsigned int)time((time_t *)NULL));
    int VideoTilanLiput;
    unsigned short RuudunLeveys, RuudunKorkeus;
    char *Otsikko;
    const int ResoluutioidenLKM = 6;
    char Resoluutiot[6][32] = 
    {
        {"640 x 480"},
        {"800 x 600"},
        {"1024 x 768"},
        {"1280 x 800"},
        {"1280 x 1024"},
        {"1600 x 1200"}
    };

    int intResoluutiot[6][2] =
    {
        {640, 480},
        {800, 600},
        {1024, 768},
        {1280, 800},
        {1280, 1024},
        {1600, 1200}
    };
    int Resoluutio = 1;
    bool FS = false;
    bool Sounds = true;
    
    ifstream SetupTiedosto( "Tiedostot\\Muu Data\\Setup.sav" , ios_base::binary );
    SetupTiedosto.read((char *) &Resoluutio, sizeof(int));
    SetupTiedosto.read((char *) &FS, sizeof(int));
    SetupTiedosto.read((char *) &Sounds, sizeof(int));
    SetupTiedosto.close();
    
    RuudunLeveys = intResoluutiot[Resoluutio][0];
    RuudunKorkeus = intResoluutiot[Resoluutio][1];
    if(FS)VideoTilanLiput = SDL_OPENGL | SDL_HWSURFACE | SDL_FULLSCREEN;
    else VideoTilanLiput = SDL_OPENGL | SDL_HWSURFACE/*| SDL_NOFRAME /**/;

    bool Turbo = false;


    AlustaOGLjaSDL( RuudunLeveys, RuudunKorkeus, VideoTilanLiput, "The Kaiho" );

    NAPPAIMET Nappaimet;
    HIIRI Hiiri;
    AlustaSyottolaiteMoottori(Nappaimet, Hiiri, RuudunLeveys, RuudunKorkeus );

    AIKA Aika;
    Aika.Alusta();

    TEKSTI Teksti;

    TEKSTI Tekstit[10];


    GRAFIIKKA GF;
    GF.Alusta( RuudunLeveys, RuudunKorkeus );
    
    int Kuvakulma = 0;
    
   
    
    OBJEKTI Museo;
    Museo.Alusta( "Tiedostot\\Objektit\\Museo.txt" );
    OBJEKTI Piha;
    Piha.Alusta( "Tiedostot\\Objektit\\Piha.txt" );
    Museo.Skaalaus = 10;
    Piha.Skaalaus = 10;
    
    PAPERPLANE *PPP;
    int PPLKM, ValittuPP = 0;
    LataaPPt( PPP, PPLKM );
    
    LENTOTIEDOT LentoT;

    OBJEKTI Puhaltaja[10];  const unsigned int PuhaltajienLKM = 6;
    double PuhaltajanNopeus[10];
    SIJAINTI PuhaltajanTavoiteSij[10];
    for(int i=0; i<PuhaltajienLKM; i++)
    {
        Puhaltaja[i].Alusta( "Tiedostot\\Objektit\\Puhaltaja.txt" );
        Puhaltaja[i].Sijainti = NollaSijainti;
        PuhaltajanTavoiteSij[i] = NollaSijainti;
        Puhaltaja[i].Skaalaus = 1 ;
    }

    KUPLA Kupla;
    Kupla.Alusta();
    char PuhkaistavaKuplaMerkki[4][2] = {{"ü"},{"ý"},{"þ"},{"ÿ"}};
    
    BONUS Bonus;
    Bonus.Alusta();
    
    MAAILMA Maa;
    Maa.Aseta( 1, 1, 1);
    
    Mix_Music *Intro = Mix_LoadMUS("Tiedostot\\Kuuluva\\intro.ogg");
    int IntroHook = 1;

    Mix_Music *Demoni = Mix_LoadMUS("Tiedostot\\Kuuluva\\demoni.ogg");
    int DemoniHook = 1;    


    Mix_Chunk *Aani[5];
    Aani[0] = Mix_LoadWAV("Tiedostot\\Kuuluva\\aani1.ogg");
    Aani[1] = Mix_LoadWAV("Tiedostot\\Kuuluva\\aani2.ogg");
    Aani[2] = Mix_LoadWAV("Tiedostot\\Kuuluva\\aani3.ogg");
    Aani[3] = Mix_LoadWAV("Tiedostot\\Kuuluva\\aani4.ogg");
    Aani[4] = Mix_LoadWAV("Tiedostot\\Kuuluva\\aani5.ogg");
    
    
    int Ajastin;
    
    const int PelityylienLKM = 7;
    char PelityylienNimet[10][64] = {{"Survivor"},{"Bubble race - Anach"},{"Bubble race - Brandir"},{"Bubble race - Ceorl"},{"Bubble race - Drúath"},{"Bubble race - Elenwë"},{"Bubble race - Finduilas"},{"Bubble race"}};
    int Pelityyli = 0;
    
    ifstream iTiedosto;
    
    PISTEET Pisteet[PelityylienLKM];
    Pisteet[0].Lataa("Tiedostot\\Muu Data\\Pisteet1.sav" );
    Pisteet[1].Lataa("Tiedostot\\Muu Data\\Pisteet2.sav" );
    Pisteet[2].Lataa("Tiedostot\\Muu Data\\Pisteet3.sav" );
    Pisteet[3].Lataa("Tiedostot\\Muu Data\\Pisteet4.sav" );
    Pisteet[4].Lataa("Tiedostot\\Muu Data\\Pisteet5.sav" );
    Pisteet[5].Lataa("Tiedostot\\Muu Data\\Pisteet6.sav" );
    Pisteet[6].Lataa("Tiedostot\\Muu Data\\Pisteet7.sav" );
    int MitkaPisteetHallissa = 0;

    PISTEET TempPisteet;
    int Pisteytetty = -1;

    unsigned long BRExtraAika = 0;
    unsigned long BRExtraAjastin = 0;
    
    
    
    bool Pause = false;
    bool Yhteenveto = false;
    char Nimi[11];
    
    
    OBJEKTI BRKuplat[200];
    int BRKuplienLKM = 0;
    int NykBRKupla = 0;
    double BRKuplatBoost[200];
    for(int i=0; i<200; i++)
    {
        BRKuplat[i].Alusta(Kupla.KuplaTyyppi[3]);
        BRKuplat[i].Skaalaus = 5;
        BRKuplatBoost[i] = 0;
    }
    
    
    
    Mix_VolumeMusic(128/3);
    
    int Valikko = 0;
    
    bool Lopeta = false;
    while(Lopeta == false)
    {
        SDL_Event Tapahtuma;
        do{
            switch(Tapahtuma.type)
            {
                case SDL_QUIT: Lopeta = true; break;

                default: PaivitaSyottolaiteMoottori(Nappaimet, Hiiri, Tapahtuma);
                break;
            }
        }while(SDL_PollEvent(&Tapahtuma) == 1);
        if(Nappaimet.NapinTila(NAP_Q) == Pohjassa && Nappaimet.NapinTila(NAP_ESCAPE) == Pohjassa)Lopeta = true;

        Aika.Paivita();


        Teksti.Alku();
        Teksti.Lisaa( "Fps: ", 0);
        Teksti.Lisaa( LukuSanaksi(Aika.AnnaFPS(), 2), 0);
        GF.TulostaTeksti( Teksti, 1280, 1024, Hiiri, YlaOikea, 0, 0.5 );

        if(Nappaimet.NapinTila(NAP_F9) == Pohjassa)Mix_VolumeMusic(0);
        if(Nappaimet.NapinTila(NAP_F10) == Pohjassa)Mix_VolumeMusic(128/6);
        if(Nappaimet.NapinTila(NAP_F11) == Pohjassa)Mix_VolumeMusic(128/3);
        if(Nappaimet.NapinTila(NAP_F12) == Pohjassa)Mix_VolumeMusic(128/3*2);

    switch( Valikko )
    {
case 0: case 2: case 3: case 7:

        GF.NaytaOsoitin();

        if( !Mix_PlayingMusic())
        {
            Mix_PlayMusic(Intro, 0);
        }
        if(Nappaimet.NapinTila( NAP_1 ) == Nostettu)Mix_PlayChannel( -1, Aani[0], 0);
        if(Nappaimet.NapinTila( NAP_2 ) == Nostettu)Mix_PlayChannel( -1, Aani[1], 0);
        if(Nappaimet.NapinTila( NAP_3 ) == Nostettu)Mix_PlayChannel( -1, Aani[2], 0);
        if(Nappaimet.NapinTila( NAP_4 ) == Nostettu)Mix_PlayChannel( -1, Aani[3], 0);
        if(Nappaimet.NapinTila( NAP_5 ) == Nostettu)Mix_PlayChannel( -1, Aani[4], 0);
        
        PPP[ValittuPP].Objekti.Sijainti = NollaSijainti;
        PPP[ValittuPP].Objekti.Sijainti.X -= 0.6;
        PPP[ValittuPP].Objekti.Sijainti.Y -= 0.1;

        PPP[ValittuPP].Objekti.Asento.Alfa = 0.333;

        PPP[ValittuPP].Objekti.AsentoM.PyoritaY( PPP[ValittuPP].Objekti.Asento.Alfa );
        OrthonormalizeMatrix( PPP[ValittuPP].Objekti.AsentoM.M );

        GF.LisaaObjekti( PPP[ValittuPP].Objekti );

        GF.Kamera().KatsottavanSijainti = NollaSijainti;
        GF.Kamera().Sijainti = PPP[ValittuPP].Objekti.Sijainti;
        GF.Kamera().Sijainti.X += 0.0 ;
        GF.Kamera().Sijainti.Y += 0.0;
        GF.Kamera().Sijainti.Z += 1.0;
        GF.Kamera().YlosV.X = 0;  GF.Kamera().YlosV.Y = 1;  GF.Kamera().YlosV.Z = 0;

break;
    }

    switch( Valikko )
    {

case 0:
        Teksti.Alku();
        Teksti.Lisaa( "- The Kaiho -", 0);
        GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.5 );

        Teksti.Alku();
        Teksti.Lisaa( "Take wing", 0, true);
        Teksti.Lisaa( "Options", 1, true);
        Teksti.Lisaa( "Video setup", 2, true);
        Teksti.Lisaa( "Hall of Fame", 3, true);
        Teksti.Lisaa( "Lue tämä!", 4, true);
        Teksti.Lisaa( "Quit", 5, true);
        GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 1 );

        
        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
        {
            Valikko = 1;
            LentoT.Alusta();
            PPP[ValittuPP].HeittoVoima = 0.5;
            PPP[ValittuPP].Objekti.Sijainti.Aseta( -100, 100, 0);
            PPP[ValittuPP].NopeusV.NollaVektoriksi();
            PPP[ValittuPP].KiihtyvyysV.NollaVektoriksi();
            
            if(Pelityyli == 0)
            {
                for(int i=0; i<PuhaltajienLKM; i++)
                {
                    Puhaltaja[i].Sijainti = NollaSijainti;
                    PuhaltajanTavoiteSij[i] = NollaSijainti;
                }
                for(int i=0; i<KUPLIENLKM; i++)
                {
                    Kupla.Kup[i].Sijainti = NollaSijainti;
                    Kupla.OnkoVapaa[i] = true;
                }

            }


            if(Pelityyli > 0)
            {
                if(Pelityyli == 1)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceA.dat" , ios_base::binary );
                if(Pelityyli == 2)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceB.dat" , ios_base::binary );
                if(Pelityyli == 3)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceC.dat" , ios_base::binary );
                if(Pelityyli == 4)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceD.dat" , ios_base::binary );
                if(Pelityyli == 5)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceE.dat" , ios_base::binary );
                if(Pelityyli == 6)iTiedosto.open( "Tiedostot\\Muu Data\\BubbleRaceF.dat" , ios_base::binary );

                iTiedosto.read((char *) &BRKuplienLKM, sizeof(int));
                for(int i=0; i<BRKuplienLKM; i++)
                {
                    iTiedosto.read((char *) &BRKuplat[i].Sijainti, sizeof(SIJAINTI));
                    iTiedosto.read((char *) &BRKuplatBoost[i], sizeof(double));
                }
                iTiedosto.close();

                NykBRKupla = 0;
                BRExtraAika = 0;
                BRExtraAjastin = 0;
            }

            Mix_HaltMusic();
            Ajastin = SDL_GetTicks();
            //SDL_WM_SetCaption("toimii", "");
            while(Ajastin+1000>SDL_GetTicks()){}
        }
        if(Teksti.ValittuKohta(1) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 2;    
        if(Teksti.ValittuKohta(2) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 7;    
        if(Teksti.ValittuKohta(3) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 3;    
        if(Teksti.ValittuKohta(4) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 6;    

        if(Teksti.ValittuKohta(5) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Lopeta = true;    
break;


case 2:
        Teksti.Alku();
        Teksti.Lisaa( "Options", 0);
        GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.5 );

        Teksti.Alku();
        Teksti.Lisaa( "Change the aeroplane", 0, true);
        Teksti.Lisaa( "Game type ", 1); Teksti.Lisaa( PelityylienNimet[Pelityyli], 1, true);
        Teksti.Lisaa( "Back to main menu", 3, true);
        GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 0.75 );
        
        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
            ValittuPP++;
        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_RIGHT) == Nostettu)
            ValittuPP--;
        if(ValittuPP == PPLKM) ValittuPP = 0;
        if(ValittuPP == -1) ValittuPP = PPLKM-1;

        if(Teksti.ValittuKohta(1) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
            Pelityyli++;
        if(Teksti.ValittuKohta(1) > 0 && Hiiri.NapinTila(BUT_RIGHT) == Nostettu)
            Pelityyli--;
        if(Pelityyli == PelityylienLKM) Pelityyli = 0;
        if(Pelityyli == -1) Pelityyli = PelityylienLKM-1;      
        



        
        if(Teksti.ValittuKohta(2) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 0;

        /*
        Teksti.Alku();
        Teksti.Lisaa( PPP[ValittuPP].Nimi, 1);
        Teksti.Lisaa( "Mass (g): ", 2);Teksti.Lisaa( LukuSanaksi(PPP[ValittuPP].Massa*1000, 2), 2);Teksti.Lisaa( "g", 2);
        Teksti.Lisaa( "Agility - Stapility (0.0 - 1.0): ", 3);Teksti.Lisaa( LukuSanaksi(PPP[ValittuPP].MassaKP, 2), 3); 
        Teksti.Lisaa( "Area of wings (cm²): ", 4); Teksti.Lisaa( LukuSanaksi(PPP[ValittuPP].SiipiAla, 2), 4);
        Teksti.Lisaa( "Aerodynamics (smaller the better; def. = 1): ", 5);Teksti.Lisaa( LukuSanaksi(PPP[ValittuPP].AeroDyn, 2), 5);
        GF.TulostaTeksti( Teksti, 1260, 20, Hiiri, AlaOikea, 0, 0.55 );*/


break;


case 7:
        Teksti.Alku();
        Teksti.Lisaa( "Video setup", 0);
        GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.5 );

        Teksti.Alku();

        Teksti.Lisaa( Resoluutiot[Resoluutio], 0, true);
        
        if(FS)Teksti.Lisaa( " Full screen", 0, true);
        if(!FS)Teksti.Lisaa( " Windowed", 0, true);
        
        if(Turbo)Teksti.Lisaa( " Turbo mode on (choose this only if your in-game Fps is under 60)", 1, true);
        if(!Turbo)Teksti.Lisaa( " Turbo mode off", 1, true);

        Teksti.Lisaa( "Back to main menu", 3, true);
        GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 0.75 );

        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Resoluutio++;
        if(Resoluutio == ResoluutioidenLKM) Resoluutio = 0;

        if(Teksti.ValittuKohta(1) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
        {
            if(FS) FS = false;
            else FS = true;
        }

        if(Teksti.ValittuKohta(2) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
        {
            if(Turbo) Turbo = false;
            else Turbo = true;
        }

        if(Teksti.ValittuKohta(3) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 0;
break;

case 3:
        Teksti.Alku();
        Teksti.Lisaa( "Hall of Fame", 0);
        GF.TulostaTeksti( Teksti, 0, 1024, Hiiri, YlaVasen, 0, 1.5 );

        Teksti.Alku();
        Teksti.Lisaa( "Game type: ", 0);
        Teksti.Lisaa( PelityylienNimet[MitkaPisteetHallissa], 0, true);

        GF.TulostaTeksti( Teksti, 0, 900, Hiiri, YlaVasen, 0, 0.8 );

        Teksti.Alku();
        Teksti.Lisaa( " Flight times: ", 1);
        Teksti.Lisaa( LukuSanaksi( Pisteet[MitkaPisteetHallissa].LentoKerrat), 1);
        GF.TulostaTeksti( Teksti, 0, 880, Hiiri, YlaVasen, 0, 0.6 );

        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
            MitkaPisteetHallissa++;
        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_RIGHT) == Nostettu)
            MitkaPisteetHallissa--;
        if(MitkaPisteetHallissa == PelityylienLKM) MitkaPisteetHallissa = 0;
        if(MitkaPisteetHallissa == -1) MitkaPisteetHallissa = PelityylienLKM-1;        
        
        
        
        Tekstit[0].Alku();Tekstit[1].Alku();Tekstit[2].Alku();Tekstit[3].Alku();
        Tekstit[1].Lisaa( "Pilot", 0);Tekstit[2].Lisaa( "Bubbles", 0);Tekstit[3].Lisaa( "Flight time", 0);
        for(int i=0; i<PistesijojenLKM; i++)
        {
            Tekstit[0].Lisaa( LukuSanaksi( i+1 ), i+2);Tekstit[0].Lisaa( ". " , i+2);
            Tekstit[1].Lisaa( Pisteet[MitkaPisteetHallissa].Nimi[i], i+2);
            Tekstit[2].Lisaa( LukuSanaksi( Pisteet[MitkaPisteetHallissa].Pisteet[i] ), i+2);
            Tekstit[3].Lisaa( LukuSanaksi( Pisteet[MitkaPisteetHallissa].LentoAika[i]*0.001), i+2); Tekstit[3].Lisaa( " s", i+2);
        }
        GF.TulostaTeksti( Tekstit[0], 1280*0.66 - 75, 900, Hiiri, YlaOikea, 0, 0.5 );
        GF.TulostaTeksti( Tekstit[1], 1280*0.66 - 75, 900, Hiiri, YlaVasen, 0, 0.5 );
        GF.TulostaTeksti( Tekstit[2], 1280*0.66 + 75, 900, Hiiri, YlaVasen, 0, 0.5 );
        GF.TulostaTeksti( Tekstit[3], 1280*0.66 + 225, 900, Hiiri, YlaVasen, 0, 0.5 );


        Teksti.Alku();
        Teksti.Lisaa( "Back to main menu", 0, true);
        GF.TulostaTeksti( Teksti, 0, 0, Hiiri, AlaVasen, 0, 0.75 );
        if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 0; 
break;












case 1:
        
        if(Nappaimet.NapinTila(NAP_PAUSE) == Nostettu )
        { if(Pause)Pause = false; else Pause = true;} 
        
        if( !Mix_PlayingMusic())
        {
            Mix_PlayMusic(Demoni, 0);
        }
        
        if(Pause)
        {
            GF.NaytaOsoitin();
            GF.LisaaObjekti( Piha );
            GF.LisaaObjekti( Museo );

            Teksti.Alku();
            Teksti.Lisaa( "Pause", 0);
            GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 1.5 );
            
            break;
        }


        GF.PiilotaOsoitin();
        if(Nappaimet.NapinTila(NAP_ESCAPE) == Pohjassa)Valikko = 4;

        if(Nappaimet.NapinTila(NAP_F1) == Nostettu ) Kuvakulma = 2;
        if(Nappaimet.NapinTila(NAP_F2) == Nostettu ) Kuvakulma = 1;
        if(Nappaimet.NapinTila(NAP_F3) == Nostettu ) Kuvakulma = 0;
        
        //Pelityyli = 10;


        if(PPP[ValittuPP].Objekti.Sijainti.Y <= 0) Valikko = 4;



        if(Pelityyli == 0)
        {
            LentoT.PisteLisays = Kupla.Paivita( PPP[ValittuPP], GF, Bonus);
            if(LentoT.PisteLisays < 0) Valikko = 4;
            else LentoT.Pisteet += LentoT.PisteLisays;
        }
        if(Pelityyli > 0)
        {
            if(( Nappaimet.NapinTila(NAP_LALT) == Pohjassa || Nappaimet.NapinTila(NAP_RALT) == Pohjassa)
            && BRExtraAjastin < SDL_GetTicks() )
            {
                BRExtraAjastin = SDL_GetTicks() + 5000;
                BRExtraAika += 8000;
                Bonus.PPNopeusLisa = 1500.0*0.0001 + (130.0-LentoT.Korkeus)*0.005;
                Bonus.Tyhjaa();
                Bonus.Teksti[0] = "eight secs penalty"; Bonus.Sanoja = 1;
                Bonus.TekstiAika = SDL_GetTicks() + 2000;
                Bonus.TekstiY = 300;
            }
            if( (Etaisyys( BRKuplat[NykBRKupla].Sijainti, PPP[ValittuPP].Objekti.Sijainti)-2.5*BRKuplat[NykBRKupla].Skaalaus) <= 0)
            {
                Bonus.PPNopeusLisa = BRKuplatBoost[NykBRKupla]*1.5;
                NykBRKupla++;
                Mix_Volume( Mix_PlayChannel( -1, Aani[3], 0), 64 );
            }
            GF.LisaaObjekti( BRKuplat[NykBRKupla]);

            if(NykBRKupla >= BRKuplienLKM) Valikko = 4;
        }


        if(Pelityyli == 10)
        {
            if(Nappaimet.NapinTila(NAP_SPACE) == Nostettu )
            {
                BRKuplat[BRKuplienLKM].Sijainti = PPP[ValittuPP].Objekti.Sijainti;
                BRKuplienLKM++;
                BRKuplatBoost[BRKuplienLKM] = (double)Sattuma(500, 2000)*0.0001 + (130.0-LentoT.Korkeus)*0.01;
                Bonus.PPNopeusLisa = BRKuplatBoost[BRKuplienLKM];
            }
            for(int i=0; i<BRKuplienLKM; i++)
            {
                GF.LisaaObjekti( BRKuplat[i]);       
            }
        }



        
        if(Hiiri.NapinTila(BUT_LEFT) == Nostettu)  PPP[ValittuPP].MassaKP -= 20.0;
        if(Hiiri.NapinTila(BUT_RIGHT) == Nostettu) PPP[ValittuPP].MassaKP += 20.0;
        PPP[ValittuPP].VasenPerasin += Hiiri.AnnaXd()*0.08;
        PPP[ValittuPP].OikeaPerasin -= Hiiri.AnnaXd()*0.08;
        PPP[ValittuPP].VasenPerasin -= Hiiri.AnnaYd()*0.1;
        PPP[ValittuPP].OikeaPerasin -= Hiiri.AnnaYd()*0.1;
        if(Hiiri.NapinTila(BUT_MIDDLE) == Pohjassa || Nappaimet.NapinTila(NAP_SPACE) == Pohjassa)PPP[ValittuPP].SiipiAla = 1;
        else PPP[ValittuPP].SiipiAla = 0;
        PPP[ValittuPP].PaivitaFysiikka( Maa, Bonus );
        
        if(Kuvakulma != 2)GF.LisaaObjekti( PPP[ValittuPP].Objekti );
        GF.LisaaObjekti( Piha );
        GF.LisaaObjekti( Museo );
        for(int i=0; i< PuhaltajienLKM; i++)
        {
            if( Sattuma(0, 10000) < 100*Bonus.KuplienTuloNopeus ){ Kupla.Puhalla( Puhaltaja[i].Sijainti ); }
            PaivitaPuhaltaja( Puhaltaja[i], PuhaltajanTavoiteSij[i], PuhaltajanNopeus[i], Bonus );

            GF.LisaaObjekti( Puhaltaja[i] );
        }
        Bonus.Paivita();
        
        
        LentoT.Paivita( Kupla, PPP[ValittuPP] );


        GF.Kamera().KatsottavanSijainti = PPP[ValittuPP].Objekti.Sijainti;
        if(Kuvakulma == 0) GF.Kamera().YlosV.Aseta( 0, 1, 0);

        if(Kuvakulma > 0) GF.Kamera().YlosV = PPP[ValittuPP].Objekti.AsentoM.YlosV();

        GF.Kamera().Sijainti = PPP[ValittuPP].Objekti.Sijainti;
        GF.Kamera().Hidastelija = 10;
        GF.Kamera().HidV[GF.Kamera().HidInd] = PPP[ValittuPP].Objekti.AsentoM.EteenV();
        GF.Kamera().HidInd++;
        if(GF.Kamera().HidInd == GF.Kamera().Hidastelija) GF.Kamera().HidInd = 0;
        GF.Kamera().NykV = GF.Kamera().HidV[GF.Kamera().HidInd];
        GF.Kamera().Sijainti.X += -GF.Kamera().NykV.X;
        GF.Kamera().Sijainti.Y += -GF.Kamera().NykV.Y;
        GF.Kamera().Sijainti.Z += -GF.Kamera().NykV.Z;

        if(Kuvakulma == 2)
        {
            GF.Kamera().Sijainti = PPP[ValittuPP].Objekti.Sijainti;
            GF.Kamera().KatsottavanSijainti.Aseta( PPP[ValittuPP].Objekti.Sijainti.X+PPP[ValittuPP].Objekti.AsentoM.EteenV().X, 
                                                   PPP[ValittuPP].Objekti.Sijainti.Y+PPP[ValittuPP].Objekti.AsentoM.EteenV().Y,
                                                   PPP[ValittuPP].Objekti.Sijainti.Z+PPP[ValittuPP].Objekti.AsentoM.EteenV().Z );
        }
        
        
        
        Teksti.Alku();
        Teksti.Lisaa( "time ", 1);
        Teksti.Lisaa( LukuSanaksi(LentoT.LentoAika *0.001, 2), 1);
        Teksti.Lisaa( "s", 1);
        if(Pelityyli > 0)
        {        
            Teksti.Lisaa( " + ", 1);
            Teksti.Lisaa( LukuSanaksi(BRExtraAika *0.001, 2), 1);
            Teksti.Lisaa( "s", 1);
        }

        Teksti.Lisaa( "alt.  ", 2);
        Teksti.Lisaa( LukuSanaksi(LentoT.Korkeus *10, 2), 2);
        Teksti.Lisaa( "cm", 2);
        
        GF.TulostaTeksti( Teksti, 0, 1024, Hiiri, YlaVasen, 0, 0.8 );
        

        Teksti.Alku();
        if(Pelityyli == 0)
        {
            Teksti.Lisaa( "Bubbles: ", 0);
            Teksti.Lisaa( LukuSanaksi(LentoT.Pisteet), 0);
            Teksti.Lisaa( "Pick up this: ", 1);
            Teksti.Lisaa( PuhkaistavaKuplaMerkki[Kupla.PuhkaistavaKuplaTyyppi], 1);
        }
        if(Pelityyli > 0)
        {
            Teksti.Lisaa( "Bubbles: ", 0);
            Teksti.Lisaa( LukuSanaksi(NykBRKupla), 0);
            Teksti.Lisaa( " of ", 0);
            Teksti.Lisaa( LukuSanaksi(BRKuplienLKM), 0);
        }
        GF.TulostaTeksti( Teksti, 0, 0, Hiiri, AlaVasen, 0, 0.8 );


        if(Bonus.Sanoja > 0)
        {
            Teksti.Alku();
            for(int i=0; i<Bonus.Sanoja; i++)
            {
                Teksti.Lisaa( Bonus.Teksti[i], 1);
            }
            GF.TulostaTeksti( Teksti, 1280/2, Bonus.TekstiY, Hiiri, KeskiKeski, 0, 1.0 );
        }
        

break;







case 4:

            
            
            GF.NaytaOsoitin();


            for(int i=0; i< PuhaltajienLKM; i++)
            {
                if( Sattuma(0, 10000) < 100*Bonus.KuplienTuloNopeus ){ Kupla.Puhalla( Puhaltaja[i].Sijainti ); }
                PaivitaPuhaltaja( Puhaltaja[i], PuhaltajanTavoiteSij[i], PuhaltajanNopeus[i], Bonus );

                GF.LisaaObjekti( Puhaltaja[i] );
            }


            Teksti.Alku();
            Teksti.Lisaa( "Game over", 0);
            GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.5 );

            Teksti.Alku();
            Teksti.Lisaa( "Name: ", 0);
            Teksti.Lisaa( Nimi, 0);
            GF.TulostaTeksti( Teksti, 1280/2, 870, Hiiri, KeskiKeski, 0, 1.0 );

            Teksti.Alku();
            Teksti.Lisaa( " ", 0);
            Teksti.Lisaa( "!\"#$%&\'()*+,-./", 1, true);
            Teksti.Lisaa( "0123456789:;<=>?", 2, true);
            Teksti.Lisaa( "@ABCDEFGHIJKLMNO", 3, true);
            Teksti.Lisaa( "PQRSTUVWXYZ[\\]^_", 4, true);
            Teksti.Lisaa( "`abcdefghijklmno", 5, true);
            Teksti.Lisaa( "pqrstuvwxyz{|}~?", 6, true);
            Teksti.Lisaa( "??‚ƒ„…†‡ˆ‰Š‹Œ???", 7, true);
            Teksti.Lisaa( "?‘’“”•–—˜™š›œ??Ÿ", 8, true);
            Teksti.Lisaa( "?¡¢£¤¥¦§¨©ª«¬­®?", 9, true);
            Teksti.Lisaa( "°±²³´µ¶·¸¹º»¼½¾¿", 10, true);
            Teksti.Lisaa( "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ", 11, true);
            Teksti.Lisaa( "ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß", 12, true);
            Teksti.Lisaa( "àáâãäåæçèéêëìíîï", 13, true);
            Teksti.Lisaa( "ðñòóôõö÷øùúûüýþÿ", 14, true);
            Teksti.Lisaa( "space  ", 15, true);
            Teksti.Lisaa( "  clear", 15, true);
            GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 0.6 );
            
            for(int i=0; i<14; i++)
            {
                if(strlen(Nimi)<10 && Hiiri.NapinTila(BUT_LEFT) == Nostettu && Teksti.ValittuKohta(i) > 0)
                {
                    Nimi[strlen(Nimi)] = Merkit[32+i*16+Teksti.ValittuKohta(i)-1];
                }
            }
            if(strlen(Nimi)<10 && Hiiri.NapinTila(BUT_LEFT) == Nostettu && Teksti.ValittuKohta(14) > 0)
            {
                Nimi[strlen(Nimi)] = ' ';
            }
            if( Hiiri.NapinTila(BUT_LEFT) == Nostettu && Teksti.ValittuKohta(15) > 0 )
            {
                memset(Nimi, 0, strlen(Nimi));
            }


            Teksti.Alku();
            Teksti.Lisaa( "To the summary", 0, true);
            GF.TulostaTeksti( Teksti, 1280/2, 0, Hiiri, AlaKeski, 0, 0.75 );
            if((Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu) ||Nappaimet.NapinTila(NAP_SPACE) == Pohjassa)
            {
                if(Pelityyli == 0)
                {
                    Pisteet[Pelityyli].LentoKerrat++;
                    TempPisteet = Pisteet[Pelityyli];
                    Pisteytetty = -1;
                    
                    for(int i=0; i<PistesijojenLKM; i++)
                    {
                        if(LentoT.Pisteet > Pisteet[Pelityyli].Pisteet[i] || (LentoT.Pisteet == Pisteet[Pelityyli].Pisteet[i] && LentoT.LentoAika > Pisteet[Pelityyli].LentoAika[i]) )
                        { 
                            if(Pisteytetty != -1)
                            {
                                Pisteet[Pelityyli].Pisteet[i] = TempPisteet.Pisteet[i-1];
                                Pisteet[Pelityyli].LentoAika[i] = TempPisteet.LentoAika[i-1];
                                strcpy( Pisteet[Pelityyli].Nimi[i], TempPisteet.Nimi[i-1]);
                            }
                            if(Pisteytetty == -1)
                            {
                                Pisteet[Pelityyli].Pisteet[i] = LentoT.Pisteet;
                                Pisteet[Pelityyli].LentoAika[i] = LentoT.LentoAika;
                                strcpy( Pisteet[Pelityyli].Nimi[i], Nimi);
                                Pisteytetty = i;
                            }
                        }
                    }
                }
                
                if(Pelityyli > 0)
                {
                    Pisteet[Pelityyli].LentoKerrat++;
                    TempPisteet = Pisteet[Pelityyli];
                    Pisteytetty = -1;
                    LentoT.LentoAika += BRExtraAika;
                    for(int i=0; i<PistesijojenLKM; i++)
                    {
                        if(NykBRKupla > Pisteet[Pelityyli].Pisteet[i] || (NykBRKupla == Pisteet[Pelityyli].Pisteet[i] && LentoT.LentoAika < Pisteet[Pelityyli].LentoAika[i]) )
                        { 
                            if(Pisteytetty != -1)
                            {
                                Pisteet[Pelityyli].Pisteet[i] = TempPisteet.Pisteet[i-1];
                                Pisteet[Pelityyli].LentoAika[i] = TempPisteet.LentoAika[i-1];
                                strcpy( Pisteet[Pelityyli].Nimi[i], TempPisteet.Nimi[i-1]);
                            }
                            if(Pisteytetty == -1)
                            {
                                Pisteet[Pelityyli].Pisteet[i] = NykBRKupla;
                                Pisteet[Pelityyli].LentoAika[i] = LentoT.LentoAika;
                                strcpy( Pisteet[Pelityyli].Nimi[i], Nimi);
                                Pisteytetty = i;
                            }
                        }
                    }
                }
                if(Pisteytetty == -1)Mix_PlayChannel( -1, Aani[0], 0);
                else Mix_PlayChannel( -1, Aani[4], 0);
                Valikko = 5;
            }
break;



case 5:
            GF.NaytaOsoitin();

            Teksti.Alku();
            Teksti.Lisaa( "- Summary -", 0);
            Teksti.Lisaa( PelityylienNimet[Pelityyli], 1);
            GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.2 );

            Teksti.Alku();
            


              

            if(Pisteytetty != -1)
            {
                Teksti.Lisaa( "Congratulations ", 0); Teksti.Lisaa( Nimi, 0); Teksti.Lisaa( "!", 0);
                Teksti.Lisaa( "You were placed ", 1); Teksti.Lisaa( LukuSanaksi(Pisteytetty+1), 1);
                    Teksti.Lisaa( ". at the Top-20.", 1);
            }
            if(Pisteytetty == -1)
            {
                Teksti.Lisaa( "Too bad ", 0); Teksti.Lisaa( Nimi, 0); Teksti.Lisaa( ",", 0);
                Teksti.Lisaa( "you were placed out of the Top-20.", 1);
            }

            if(Pelityyli == 0)
            {        
                Teksti.Lisaa( "Bubbles picked up: ", 4); Teksti.Lisaa( LukuSanaksi(LentoT.Pisteet), 4);
            }
                
            if(Pelityyli > 0)
            {
                Teksti.Lisaa( "Bubbles picked up: ", 4); Teksti.Lisaa( LukuSanaksi(NykBRKupla), 4);
                Teksti.Lisaa( " of ", 4); Teksti.Lisaa( LukuSanaksi(BRKuplienLKM), 4);
            }

            Teksti.Lisaa( "Flight time: ", 5); Teksti.Lisaa( LukuSanaksi(LentoT.LentoAika*0.001, 2), 5);
            Teksti.Lisaa( " seconds", 5);



            GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 0.8 );

            Teksti.Alku();
            Teksti.Lisaa( "Back to main menu", 0, true);
            GF.TulostaTeksti( Teksti, 0, 0, Hiiri, AlaVasen, 0, 0.75 );
            if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)
            {
                Valikko = 0; 
                Mix_HaltMusic();
            }
break;



case 6:
            GF.NaytaOsoitin();
            //GF.LisaaObjekti( Piha );
            //GF.LisaaObjekti( Museo );

            Teksti.Alku();
            Teksti.Lisaa( "Lukemista", 0);
            GF.TulostaTeksti( Teksti, 1280/2, 1024, Hiiri, YlaKeski, 0, 1.5 );

            Teksti.Alku();
            Teksti.Lisaa( "Pelityypit", 0);
            Teksti.Lisaa( "  • Survivor: Kerää mahdollisimman monta kuplaa.", 1);
            Teksti.Lisaa( "  • Bubble race: Kerää kuplat mahdollisimman NOPEASTI.", 2);
            
            
            Teksti.Lisaa( "Näppäimet", 4);
            Teksti.Lisaa( "  • hiiren liikutus ylös/alas - lennokin kääntäminen ylös/alas asentoonsa nähden", 5);
            Teksti.Lisaa( "  • hiiren liikutus sivuttain - lennokin pyörittäminen menosuuntaan nähden", 6);
            Teksti.Lisaa( "  • hiiren oikean/vasemman napin rämpytys - lennokin kääntäminen sivuttain", 7);
            Teksti.Lisaa( "  • hiiren keskinappi tai Space - lennokin oikaisu", 8);
            Teksti.Lisaa( "  • Alt - lisänopeus (vain Bubble race)", 9);
            Teksti.Lisaa( "  • F1...F3 - kuvakulmat", 10);
            Teksti.Lisaa( "  • F9...F12 - musiikin voimakkuus", 11);
            
            
            Teksti.Lisaa( "Vinkkejä aloittelijalle", 13);

            Teksti.Lisaa( "  • Pyri ensisijaisesti kääntämään lennokkia napeilla", 14);
            Teksti.Lisaa( "  • Käytä hiiren liikutus -kääntämistä vain tiukoissa, tai ylös/alas käännöksissä", 15);
            Teksti.Lisaa( "    (On tehokkampaa!).", 16);
            Teksti.Lisaa( "  • Lennokkia kääntäessä hiirellä tai pyörittässä:", 17);
            Teksti.Lisaa( "    pidä mielessä, ettei sinun kannata likkuttaa hiirtä muuten", 18);
            Teksti.Lisaa( "    kuin TÄSMÄLLEEN ylös tai TÄSMÄLLEEN oikeaan jne.", 19);
            Teksti.Lisaa( "    Eli EI KOSKAAN mihinkään viistoon!", 20);
            Teksti.Lisaa( "    Esim.: Pyöritä lennokki ensiksi sivuttain liikuttamalla oikealle", 21);
            Teksti.Lisaa( "              ja vasta sen jälkeen käännä lennokkia liikuttamalla pystysuunnassa", 22);
            Teksti.Lisaa( "  • Jos lennokki on vinossa (esim. sivuttaissilmukan jälkeen) -> oikaise se!", 23);
            Teksti.Lisaa( "  • Käytä lisänopeutta vain hätätapauksissa (sakkosekunteja!).", 24);
            Teksti.Lisaa( "  • Lisänopeutta saa sitä enenmmän mitä matalammalla on.", 25);

            Teksti.Lisaa( "Omat lennokit", 27);
            Teksti.Lisaa( "  • Lisää tekemäsi 3D modelisi \"Tiedostot\\3D Mallit\"", 28);
            Teksti.Lisaa( "  • Lisää tekemäsi tekstuuri \"Tiedostot\\Tekstuurit\"", 29);
            Teksti.Lisaa( "    Voit myös käyttää hyväksesi tekstuurimalleja ja tehdä pelkän tekstuurin (kuvan)", 30);
            Teksti.Lisaa( "    vanhalle 3d modelille", 31);
            Teksti.Lisaa( "  • Tee \"Tiedostot\\PP\":ssä uusi tiedosto ja täytä oikein (ota mallia).", 32);
            Teksti.Lisaa( "    Huom! Statsien muokkaus ei vielä toiminnassa.", 33);
            Teksti.Lisaa( "  • Lisää \"Tiedostot\\LatausLista.txt\":hen tekemäsi tiedostot (ota mallia!)." , 34);



            GF.TulostaTeksti( Teksti, 0, 900+1280/2-Hiiri.AnnaX()*0.5, Hiiri, YlaVasen, 0, 0.6 );


            Teksti.Alku();
            Teksti.Lisaa( "Back to main menu", 0, true);
            GF.TulostaTeksti( Teksti, 0, 0, Hiiri, AlaVasen, 0, 0.75 );
            if(Teksti.ValittuKohta(0) > 0 && Hiiri.NapinTila(BUT_LEFT) == Nostettu)Valikko = 0; 
break;

    }






        




        if(!Turbo)Aika.KierrosAika = 0;
        GF.Paivita( Otsikko, Hiiri.AnnaX(), Hiiri.AnnaY(), Aika.KierrosAika );


        long LoppuAika = SDL_GetTicks();
        if(Lopeta)
        {
            Teksti.Alku();
            Teksti.Lisaa( "The game by Lassi Palmujoki", 0);
            Teksti.Lisaa( "Musics by Sauli Palmujoki", 3);
            GF.TulostaTeksti( Teksti, 1280/2, 1024/2, Hiiri, KeskiKeski, 0, 1.0 );
            GF.PiilotaOsoitin();
            GF.Paivita( Otsikko, Hiiri.AnnaX(), Hiiri.AnnaY(), Aika.KierrosAika );
            while(Mix_PlayingMusic()){}
        }

    }
    


    ofstream Tiedosto( "Tiedostot\\Muu Data\\Setup.sav" , ios_base::binary );
    Tiedosto.write((char *) &Resoluutio, sizeof(int));
    Tiedosto.write((char *) &FS, sizeof(int));
    Tiedosto.write((char *) &Sounds, sizeof(int));
    Tiedosto.close();
    /*
    ofstream Tiedosto( "Tiedostot\\Tallennukset\\BubbleRaceF.dat" , ios_base::binary );
    Tiedosto.write((char *) &TestiKuplienLKM, sizeof(int));
    for(int i=0; i<TestiKuplienLKM; i++)
    {
        Tiedosto.write((char *) &TestiKuplat[i].Sijainti, sizeof(SIJAINTI));
        Tiedosto.write((char *) &TestiKuplatBoost[i], sizeof(double));
    }
    Tiedosto.close();
    */

    Pisteet[0].Tallenna("Tiedostot\\Muu Data\\Pisteet1.sav" );
    Pisteet[1].Tallenna("Tiedostot\\Muu Data\\Pisteet2.sav" );
    Pisteet[2].Tallenna("Tiedostot\\Muu Data\\Pisteet3.sav" );
    Pisteet[3].Tallenna("Tiedostot\\Muu Data\\Pisteet4.sav" );
    Pisteet[4].Tallenna("Tiedostot\\Muu Data\\Pisteet5.sav" );
    Pisteet[5].Tallenna("Tiedostot\\Muu Data\\Pisteet6.sav" );
    Pisteet[6].Tallenna("Tiedostot\\Muu Data\\Pisteet7.sav" );



    SDL_Quit();
    return(0);
}










